//
//  main.c
//  Optimization-SokobanGame
//
//  Created by admin on 2019/7/26.
//  Copyright © 2019 猫爷爷的酱醋茶. All rights reserved.
//

/*
 
 while(1)
 {
 
     1.显示地图，并接收用户输入方向
 
     2.根据输入方向移动小人
 
 }
 
 */

#include <stdio.h>
#include <stdlib.h>

#define ROWS 10
//字符串以'\0'结尾
#define COLS 11

char map[ROWS][COLS] =
{
    "##########",
    "#  ####  #",
    "# X####  #",
    "# O      #",
    "######   #",
    "#  ####  #",
    "#        #",
    "#   ######",
    "#         ",
    "##########"
};

//小人默认位置
int personCurrentRow = 3;
int personCurrentCol = 2;

//存储小人当前位置
int StorageRow = 0;
int StorageCol = 0;

//用户输入的方向
char direction = 'a';

int success = 1;

//显示地图，并接受用户输入方向
char ShowMap(void);

//根据用户输入方向，判断位置
void JudgingPosition(char direction);

//移动小人
void MovePerson(void);

int main(int argc, const char * argv[])
{
    while (success)
    {
        //刷新地图 -> 清除数据
        system("clear");
        //显示地图，并接受用户输入方向
        direction = ShowMap();
        
        if(map[8][9] == 'X'){
            
            printf("恭喜啊，恭喜啊，你完成了～");
            map[8][9] = 'K';
            
            //刷新地图 -> 清除数据
            system("clear");
            
            //显示地图
            ShowMap();
            break;
            
        }
        
        //根据用户输入方向，判断位置
        JudgingPosition(direction);
        
        //根据位置移动小人
        MovePerson();
    }
    return 0;
}

//移动小人
void MovePerson(void)
{
    if(map[personCurrentRow][personCurrentCol] == ' '){
        
        map[personCurrentRow][personCurrentCol] = 'O';
        map[StorageRow][StorageCol] = ' ';
        
        
    }
    else if(map[personCurrentRow][personCurrentCol] == 'X')
    {
        //存储小人的位置
        int currentRow = StorageRow;
        int currentCol = StorageCol;
        
        //第二次执行，StorageRow/Col存储箱子的位置
        JudgingPosition(direction);
        
        //判断箱子下一个坐标的状态
        if(map[personCurrentRow][personCurrentCol] == ' ')
        {
            map[personCurrentRow][personCurrentCol] = 'X';
            map[StorageRow][StorageCol] = 'O';
            map[currentRow][currentCol] = ' ';
            personCurrentRow = StorageRow;
            personCurrentCol = StorageCol;
        }
        if (map[personCurrentRow][personCurrentCol] == 'X') {
            personCurrentRow = currentRow;
            personCurrentCol = currentCol;
        }
       
    
    }

}


//根据用户输入方向，判断位置
void JudgingPosition(char direction)
{
    //第一次是存储小人的位置
    //第二次执行则是存储箱子的位置
    StorageRow = personCurrentRow;
    StorageCol = personCurrentCol;
    switch (direction)
    {
        case 'a':
        case 'A':
            //向左推
            if (map[StorageRow][StorageCol - 1] != '#')
            {
                personCurrentCol -= 1;
            }
            break;
        case 'w':
        case 'W':
            //向上推
            if (map[StorageRow - 1][StorageCol] != '#')
            {
                personCurrentRow -= 1;
            }
            break;
        case 'd':
        case 'D':
            //向右推
            if (map[StorageRow][StorageCol + 1] != '#')
            {
                personCurrentCol += 1;
            }
            break;
        case 's':
        case 'S':
            //向下推
            if (map[StorageRow + 1][StorageCol] != '#')
            {
                 personCurrentRow += 1;
            }
            break;
        case 'r':
        case 'R':
            //重新开始
            success = 0;
            break;
        default:
            printf("\n请移动小人...");
            break;
    }
}

//显示地图，并接受用户输入方向
char ShowMap(void)
{
    
    //遍历数组
    for (int i = 0; i < ROWS; i++)
    {
        printf("%s\n",map[i]);
    }
    
    //提示用户输入小人的前进方向
    printf("                  W\n请控制小人推动 A     D       按R.退出游戏 O是小人，X是箱子\n                  S\n");
    
    //接收用户输入的方向
    char direction = 'a';
    
    //清理缓存空间
    rewind(stdin);
    
    scanf("%c",&direction);
    
    return direction;
    
    
}



    



